<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script>
            // 普通函数this指向window，严格模式下指向undefined
            // 箭头函数this指向外层的this，向外一层层找，直到找到为止
            const obj = {
                name: 'obj',
                say: () => {
                    console.log(this); // window
                },
                sing: function() {
                    console.log(this); // obj
                }
            }
            const obj2 = {
                name: 'obj2'
            }
            // obj.say();
            // obj.sing();
            
            // call、apply、bind 允许我们改变this指向
            // call(参数1, 参数2, 参数3, ...) 参数1是this指向，后面的参数是函数的参数，返回值是函数的返回值
            // 对于箭头函数，call、apply、bind无法改变this指向
            obj.say.call(obj2);
            obj.sing.call(obj2);
            
            // apply(参数1, [参数2, 参数3, ...]) 参数1是this指向，第二个参数必须是数组，返回值是函数的返回值
            // 比如用于求数组最大值
            const arr = [1, 2, 3, 4, 5];
            console.log(Math.max.apply(null, arr));
            // bind(参数1, 参数2, 参数3, ...) 参数1是this指向，后面的参数是函数的参数，返回值是一个函数
            // bind 不会调用函数，只是改变this指向
            
        </script>
    
    </body>
</html>